/******************************************************************************* * Copyright (c) 2009, 2014 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.ui.tests.services; import java.text.SimpleDateFormat; import java.util.Date; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.internal.PartSite; import org.eclipse.ui.internal.progress.WorkbenchSiteProgressService; import org.eclipse.ui.internal.progress.WorkbenchSiteProgressService.SiteUpdateJob; import org.eclipse.ui.progress.IWorkbenchSiteProgressService; import org.eclipse.ui.tests.harness.util.UITestCase; /** * @since 3.5 * @author Prakash G.R. */ public class WorkbenchSiteProgressServiceTest extends UITestCase{ public WorkbenchSiteProgressServiceTest(String testName) { super(testName); } private IWorkbenchPart activePart; private IWorkbenchWindow window; private SiteUpdateJob updateJob; private WorkbenchSiteProgressService progressService; private IWorkbenchPartSite site; private SimpleDateFormat dateFormat; @Override protected void doSetUp() throws Exception { super.doSetUp(); window = openTestWindow("org.eclipse.ui.resourcePerspective"); activePart = window.getActivePage().getActivePart(); assertNotNull(activePart); site = activePart.getSite(); progressService = (WorkbenchSiteProgressService) site.getService(IWorkbenchSiteProgressService.class); updateJob = progressService.getUpdateJob(); dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z"); } public void forceUpdate() { // ugly trick, but keeps the test going ... updateJob.run(new NullProgressMonitor()); } public void testWaitCursor() throws Exception { // Fire a job with cursor set to true and check the cursor LongJob jobWithCursor = new LongJob(); try { progressService.schedule(jobWithCursor, 0, true); logTime("after schedule: "); while (jobWithCursor.getState() != Job.RUNNING) { Thread.sleep(100); } logTime("after waiting: "); processEvents(); logTime("after process: "); forceUpdate(); logTime("after update: "); processEvents(); logTime("after process2: "); Cursor cursor = ((Control) ((PartSite) site).getModel().getWidget()) .getCursor(); logTime("after getCursor: "); assertNotNull(cursor); } finally { jobWithCursor.cancel(); logTime("after cancel: "); processEvents(); logTime("after process3: "); // wait till this job is done while (jobWithCursor.getState() == Job.RUNNING) { Thread.sleep(100); } logTime("after done: "); processEvents(); logTime("after process4: "); forceUpdate(); logTime("after update2: "); processEvents(); logTime("after process5: "); } Cursor cursor = ((Control) ((PartSite) site).getModel().getWidget()) .getCursor(); logTime("after getCursor2: "); assertNull(cursor); // no jobs, no cursor } public void testWaitCursorConcurrentJobs() throws Exception { // Fire two jobs, first one with cursor & delay, // the second one without any cursor or delay. // Till the first job starts running, there should not be a cursor, // after it starts running cursor should be present. LongJob jobWithoutCursor = new LongJob(); LongJob jobWithCursor = new LongJob(); try { progressService.schedule(jobWithCursor, 2000, true); progressService.schedule(jobWithoutCursor, 0, false); logTime("after schedule: "); while (jobWithoutCursor.getState() != Job.RUNNING) { Thread.sleep(100); } logTime("after waiting: "); processEvents(); logTime("after process: "); // we just want the jobWithoutCursor running assertTrue(jobWithCursor.getState() != Job.RUNNING); forceUpdate(); logTime("after update: "); processEvents(); logTime("after process2: "); Cursor cursor = ((Control) ((PartSite) site).getModel().getWidget()) .getCursor(); logTime("after getCursor: "); assertNull(cursor); // jobWithoutCursor is scheduled to run first - // no cursor now while (jobWithCursor.getState() != Job.RUNNING) { Thread.sleep(100); } logTime("after waiting2: "); processEvents(); logTime("after process3: "); // both jobs should be running assertTrue(jobWithCursor.getState() == Job.RUNNING && jobWithoutCursor.getState() == Job.RUNNING); forceUpdate(); logTime("after update2: "); processEvents(); logTime("after process4: "); cursor = ((Control) ((PartSite) site).getModel().getWidget()) .getCursor(); logTime("after getCursor2: "); assertNotNull(cursor); // both running now - cursor should be set } finally { jobWithCursor.cancel(); logTime("after cancel: "); jobWithoutCursor.cancel(); logTime("after cancel2: "); processEvents(); logTime("after process5: "); // wait till the jobs are done while (jobWithCursor.getState() == Job.RUNNING || jobWithoutCursor.getState() == Job.RUNNING) { Thread.sleep(100); } logTime("after done: "); processEvents(); logTime("after process6: "); forceUpdate(); logTime("after update3: "); processEvents(); logTime("after process7: "); } Cursor cursor = ((Control) ((PartSite) site).getModel().getWidget()) .getCursor(); logTime("after getCursor3: "); assertNull(cursor); // no jobs, no cursor } private void logTime(String message) { System.out.println(message + dateFormat.format(new Date())); } class LongJob extends Job{ public LongJob() { super("LongJob"); } @Override protected IStatus run(IProgressMonitor monitor) { monitor.beginTask("job starts", 1000); for (int i = 0; i < 1000; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { } if(monitor.isCanceled()) { break; } monitor.worked(1); } return Status.OK_STATUS; } } }